// Copyright©,2020-2025
// Author: caocheng
// Version: 1.0.0
// Date: 2021/2/25 14:30
// Description：
package SummerWeb

// Filter 过滤器接口
type Filter interface {
	// Invoke 通过 chain.Next() 驱动链条向后执行
	Invoke(ctx WebContext, chain FilterChain)
}

// handlerFilter 包装 Web 处理接口的过滤器
type handlerFilter struct {
	fn Handler
}

// HandlerFilter 把 Web 处理接口转换成过滤器
func HandlerFilter(fn Handler) Filter {
	return &handlerFilter{fn: fn}
}

func (h *handlerFilter) Invoke(ctx WebContext, _ FilterChain) {
	h.fn.Invoke(ctx)
}

// FilterChain 过滤器链条接口
type FilterChain interface {
	Next(ctx WebContext)
}

// DefaultFilterChain 默认的过滤器链条
type DefaultFilterChain struct {
	filters []Filter // 过滤器列表
	next    int      // 下一个等待执行的过滤器的序号
}

// NewDefaultFilterChain DefaultFilterChain 的构造函数
func NewDefaultFilterChain(filters []Filter) *DefaultFilterChain {
	return &DefaultFilterChain{filters: filters}
}

func (chain *DefaultFilterChain) Next(ctx WebContext) {

	// 链条执行到此结束
	if chain.next >= len(chain.filters) {
		return
	}

	// 执行下一个过滤器
	f := chain.filters[chain.next]
	chain.next++
	f.Invoke(ctx, chain)
}